package cn.lingyangwl.agile.system.service;

import cn.lingyangwl.agile.system.model.entity.SysDept;
import cn.lingyangwl.agile.system.model.rqrs.dept.DeptListReq;
import cn.lingyangwl.agile.system.model.rqrs.dept.DeptResp;
import cn.lingyangwl.agile.system.model.rqrs.dept.DeptUpdateReq;
import cn.lingyangwl.agile.system.model.rqrs.user.UserDeptListReq;

import java.util.Collection;
import java.util.List;

/**
 * 部门管理 服务层
 * 
 * @author shenguangyang
 */
public interface SysDeptService {
    /**
     * 查询部门管理数据, 没有构建树结构
     * 
     * @param req 部门信息
     * @return 部门信息集合
     */
    List<DeptResp> listDept(DeptListReq req);

    List<DeptResp> listDeptTree(DeptListReq req);

    /**
     * 根据指定的ids查询部门
     *
     * @param ids 部门信息
     * @return 部门信息集合
     */
    List<SysDept> listDeptByIds(Collection<Long> ids);

    /**
     * 构建前端所需要树结构
     * 
     * @param depts 部门列表
     * @return 树结构列表
     */
    List<DeptResp> buildDeptTree(List<DeptResp> depts);

    /**
     * 构建前端所需要下拉树结构
     * 
     * @param depts 部门列表
     * @return 下拉树结构列表
     */
    List<DeptResp> buildDeptTreeSelect(List<DeptResp> depts);

    /**
     * 根据角色ID查询部门树信息
     * 
     * @param roleId 角色ID
     * @return 选中部门列表
     */
    List<Long> listDeptTreeInRole(Long roleId);

    /**
     * 根据部门ID查询信息
     * 
     * @param deptId 部门ID
     * @return 部门信息
     */
    SysDept getDeptById(Long deptId);

    /**
     * 根据ID查询所有子部门（正常状态）
     * 
     * @param deptId 部门ID
     * @return 子部门数
     */
    int selectNormalChildrenDeptById(Long deptId);

    /**
     * 通过用户id查询部门ids
     * @param userId 用户ids
     * @return 部门ids集合
     */
    List<Long> listDeptIdByUserId(Long userId);

    /**
     * 查询用户中的部门
     */
    List<DeptResp> listUserDept(UserDeptListReq req);

    /**
     * 是否存在部门子节点
     * 
     * @param deptId 部门ID
     * @return 结果
     */
    boolean hasChildByDeptId(Long deptId);

    /**
     * 查询部门是否存在用户
     * 
     * @param deptId 部门ID
     * @return 结果 true 存在 false 不存在
     */
    boolean checkDeptExistUser(Long deptId);

    /**
     * 检查部门code是否唯一
     */
    void checkDeptCodeUnique(String deptCode);

    /**
     * 新增保存部门信息
     * 
     * @param dept 部门信息
     * @return 结果
     */
    int saveDept(SysDept dept);

    /**
     * 修改保存部门信息
     *
     * @return 结果
     */
    boolean updateDept(DeptUpdateReq req);

    /**
     * 批量删除部门管理信息
     *
     * @param deptIds 部门ID
     */
    void deleteBatch(String[] deptIds);

    /**
     * 根据parentId查询部门树
     * @param ids 前端回显传递
     */
    List<DeptResp> listDeptTreeSync(String parentId, String ids);
}
